/*
7-29 二分法求多项式单根
分数 20
作者 杨起帆
单位 浙大城市学院

二分法求函数根的原理为：如果连续函数f(x)在区间[a,b]的两个端点取值异号，即f(a)f(b)<0，则它在这个区间内至少存在1个根r，即f(r)=0。

二分法的步骤为：

    检查区间长度，如果小于给定阈值，则停止，输出区间中点(a+b)/2；否则
    如果f(a)f(b)<0，则计算中点的值f((a+b)/2)；
    如果f((a+b)/2)正好为0，则(a+b)/2就是要求的根；否则
    如果f((a+b)/2)与f(a)同号，则说明根在区间[(a+b)/2,b]，令a=(a+b)/2，重复循环；
    如果f((a+b)/2)与f(b)同号，则说明根在区间[a,(a+b)/2]，令b=(a+b)/2，重复循环。

本题目要求编写程序，计算给定3阶多项式f(x)=a3​x3+a2​x2+a1​x+a0​在给定区间[a,b]内的根。
输入格式：

输入在第1行中顺序给出多项式的4个系数a3​、a2​、a1​、a0​，在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。
输出格式：

在一行中输出该多项式在该区间内的根，精确到小数点后2位。
输入样例：

3 -1 -3 1
-0.5 0.5

输出样例：

0.33
*/
#include <stdio.h>
#include <math.h>

float f(float a0, float a1, float a2, float a3, float x) {
    return a3 * pow(x, 3) + a2 * pow(x, 2) + a1 * x + a0;
}

int main() {
    float epsn = 1e-5; // ε
    float a0, a1, a2, a3;
    float a, b;

    scanf("%f %f %f %f %f %f", &a3, &a2, &a1, &a0, &a, &b);
    // printf("%f %f %f %f %f %f\n", a3, a2, a1, a0, a, b);
    while(1) {
        // 计算 a, b 两个端点的函数值
        float fa = f(a0, a1, a2, a3, a);
        float fb = f(a0, a1, a2, a3, b);
        // 计算中点的函数值
        float mid = (a + b) / 2;
        float fm = f(a0, a1, a2, a3, mid);
        // printf("mid = %f, fa = %f, fb = %f, fm = %f\n", mid, fa, fb, fm);
        if (fabs(fm) < epsn) {
            printf("%.2f\n", mid);
            break;
        }
        if (fa * fm > 0) {
            // f((a+b)/2)与f(a)同号，则说明根在区间[(a+b)/2,b]，令a=(a+b)/2，重复循环
            a = mid;
        } else {
            // 题目保证有根，不用再次判断 f((a+b)/2)与f(b)同号
            b = mid;
        }
    }
    return 0;
}